ret = test_and_clear_bit(vector, &VCPU(vcpu, irr[0]));
local_irq_restore(spsr);
- if (ret)
+ if (ret) {
vcpu->arch.irq_new_pending = 1;
+ wmb();
+ }
return ret;
}
ret = test_and_set_bit(vector, &VCPU(vcpu, irr[0]));
local_irq_restore(spsr);
- if (!ret)
+ if (!ret) {
vcpu->arch.irq_new_pending = 1;
+ wmb();
+ }
return ret;
}
}
local_irq_restore(spsr);
vcpu->arch.irq_new_pending = 1;
+ wmb();
}
/*
VLSAPIC_INSVC(vcpu,vec>>6) &= ~(1UL <<(vec&63));
VCPU(vcpu, eoi)=0; // overwrite the data
vcpu->arch.irq_new_pending=1;
+ wmb();
}
int is_unmasked_irq(VCPU *vcpu)
if (v->vcpu_id == 0) {
int callback_irq =
d->arch.hvm_domain.params[HVM_PARAM_CALLBACK_IRQ];
- if (callback_irq != 0 && local_events_need_delivery()) {
- /*inject para-device call back irq*/
- v->vcpu_info->evtchn_upcall_mask = 1;
- vmx_vcpu_pend_interrupt(v, callback_irq);
+ if (callback_irq != 0) {
+ /* change level for para-device callback irq */
+ vmx_vioapic_set_irq(d, callback_irq,
+ local_events_need_delivery());
}
}
- if ( v->arch.irq_new_pending ) {
- v->arch.irq_new_pending = 0;
+ rmb();
+ if (xchg(&v->arch.irq_new_pending, 0)) {
v->arch.irq_new_condition = 0;
vmx_check_pending_irq(v);
return;